package com.fayou.mq.mqrabbitmqdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MqRabbitmqDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MqRabbitmqDemoApplication.class, args);
    }

    /**
     * rabbitMQ工作流程
     *
     * 1. producer发送消息到交换机    rabbitTemplate.convertAndSend();
     * 2. 交换机通过routingKey，将消息binding到对应的Queue
     *       Binding orderBinding(TopicExchange orderTopic, Queue orderQueue) {
     *         return BindingBuilder
     *                 .bind(orderQueue)
     *                 .to(orderTopic)
     *                 .with(QueueEnum.QUEUE_ORDER_CANCEL.getRouteKey());
     *     }
     *
     *     代码可以看出 Builder构造器绑定消息队列到Topic交换机，使用RouteKey，
     *     那么我发送一个带有RouteKey的消息到Topic交换机，交换机根据这个RouteKey找到对应的queue，
     *     然后将消息放到queue中
     * 3. queue根据topic,fanout,还是direct,分发消息到接收端
     *
     *
     *
     *
     * Exchange：交换机，接受消息，根据路由键（routingKey）转发消息到绑定的消息队列
     * 消息实际上投递到的是交换机，具体路由到那个队列由交换机根据路由键(routing key)完成
     *
     *
     *   *  direct： 如果路由键匹配，消息就投递到对应的队列
     *   *  fanout：投递消息给所有绑定在当前交换机上面的队列
     *   *  topic:
     *              * 可以替换一个单词
     *              # 可以替换所有的单词
     *    direct为1v1, fanout为1v所有，topic比较灵活，可以1v任意
     *
     *
     *  Binding: Exchange和Queue之间的虚拟连接
     *
     *  Routing Key ：一个路由规则，虚拟机可用它来确定如何路由一个特定消息
     *
     */
}
